package A0326;

import java.util.ArrayList;
import java.util.List;

public class A0326 {
    //栈一般是用来协助函数调用的

    private int a = 1;//非静态，成员变量，每个new出来的实例都有自己独立的a
    private int age = 80;

    public int getAge(String password) {
        if(!password.equals("123456")){
            return -1;
        }
        return age;
    }

    public void setAge(int age) {
        if(age < 0){return;}
        this.age = age;
    }

    public void fun1(){
        System.out.println("fun1正在执行");
    }
    public void fun(){
        //第一次是a0326这个实例（对象）调用的这个函数，所以打印2
        //第一次是obj1这个实例（对象）调用的这个函数，所以打印10086
        System.out.println(this);//this相当于运行该函数的一个实例
        System.out.println(this.a);//this代表当前的实例
        this.fun1();
    }

    public A0326(int a) {
        this();
        this.a = a;
    }

    public A0326() {//一个函数参数都没有的，叫空参构造器
        System.out.println("无参构造器被调用");
        return;
    }

    static {
        System.out.println("我是静态构造块");
    }

    {
        System.out.println("我是非静态构造块");
    }
    public static void main(String[] args) {
        A0326 a0326 = new A0326();//根据类A0326创建了一个实例（对象）a0326
        //new A0326()生成了一个对象，对象的内存一般是分配在heap
        //a0326可以理解成一个指向堆内存的指针，
        A0326 obj = a0326;//这种创建对象的方法叫浅拷贝
        a0326.a = 2;
        System.out.println(a0326);
        System.out.println(obj);
        System.out.println(a0326.a);
        System.out.println(obj.a);
        //打印对象的结果，是对对象在内存的一种描述
        //所以我们证明了a0326和obj指向了同一块堆内存（绝大多数情况下使用new关键字创建的对象，会使用heap堆内存）
//        List<Integer> list = new ArrayList<Integer>();
        List<Integer> list = new ArrayList<>();
        list.add(1);list.add(2);list.add(3);
        List<Integer> list2 = new ArrayList<>(list); //深拷贝
        List<Integer> list1 = list;//浅拷贝
        list.add(4);
        for(Integer i : list1){
            System.out.println(i);
        }
        for(Integer i : list2){
            System.out.println(i);
        }
        A0326 obj1 = new A0326();
        a0326.fun();
        obj1.a = 10086;
        obj1.fun();
        System.out.println(a0326);
        System.out.println(obj1);
        A0326 obj2 = new A0326();//调用的空参构造器
        A0326 obj3 = new A0326(99);//调用的有参构造器
        System.out.println(obj2.a);
        System.out.println(obj3.a);//
        A0326 obj4 = new A0326(99);//调用的有参构造器
        int s = 2;
        System.out.println(s);
    }
}
//A0326.A0326@10f87f48 a0326  A0326.A0326@10f87f48
//A0326.A0326@b4c966a obj1  A0326.A0326@b4c966a
